/**
 * app.js入口模块
 * 职责：
 * 1.创建服务
 * 2.做一些服务相关配置
 *     模板引擎
 *     body-parser解析表单post请求体
 *     提供静态资源服务
 * 3.挂载路由
 * 4.监听端口启动服务
 */

var express = require('express')

// 本地db.json数据库
// var router = require('./router_dbjson.js')

// mongodb数据库
var router = require('./router_mongo.js')

var bodyParser = require('body-parser') 

var server = express()

server.engine('html', require('express-art-template')) // 不能注释，注释了就找不到html模板了

// css文件渲染
server.use('/node_modules/',express.static('./node_modules/'))
server.use('/public/',express.static('./public/'))

// post解析  npm install --save body-parser 注意：一定要写在 server.use(router) 之前   
server.use(bodyParser.urlencoded({ extended: false }))
server.use(bodyParser.json())

// 解决跨域  这是个中间件函数
// 中间件函数是可以访问请求对象( req)、响应对象( res) 和next应用程序请求-响应循环中的函数的函数
// 该next函数是 Express 路由器中的一个函数，当被调用时，它会在当前中间件之后执行中间件。
// 中间件功能可以执行以下任务：
// 1.执行任何代码。
// 2.对请求和响应对象进行更改。
// 3.结束请求-响应循环。
// 4.调用堆栈中的下一个中间件。
// 如果当前中间件函数没有结束请求-响应循环，它必须调用next()将控制权传递给下一个中间件函数。否则，请求将被挂起

// 要加载中间件函数，请调用server.use()，指定中间件函数。
server.use((req, res, next) => {
    //设置请求头
    // console.log(res)
    console.log(req)
    res.set({
        'Access-Control-Allow-Credentials': true,
        'Access-Control-Max-Age': 1728000,
        'Access-Control-Allow-Origin': req.headers.origin || '*', // 解决跨域最关键的一句
        'Access-Control-Allow-Headers': 'X-Requested-With,Content-Type',
        'Access-Control-Allow-Methods': 'PUT,POST,GET,DELETE,OPTIONS',
        'Content-Type': 'application/json; charset=utf-8'
    })
    req.method === 'OPTIONS' ? res.status(204).end() : next()
})

// 把路由容器挂载到app服务中
server.use(router)

server.listen(4000,function() {
    console.log('server is running in port 4000')
})

